#define  _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

// 初始化棋盘
// arr: 要初始化的棋盘数组
// rows: 棋盘的行数
// cols: 棋盘的列数
// set: 要设置的初始值
void initboard(char arr[ROWs][COLs], int rows, int cols, char set)
{
	int i = 0;
	for(i = 0; i < rows; i++)
	{
		int j = 0;
		for(j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}


// 显示棋盘
// arr: 要显示的棋盘数组
// row: 棋盘的行数
// col: 棋盘的列数
void displayboard(char arr[ROWs][COLs], int row, int col)
{
	int i = 0;
	
	// 打印列号
	printf("\n  ");
	for (i = 1; i <= col; i++)
	{
		printf("%-3d", i);
	}
	printf("\n");
	
	// 打印分割线
	printf("  ");
	for (i = 1; i <= col; i++)
	{
		printf("---");
	}
	printf("\n");
	
	// 打印行内容
	for (i = 1; i <= row; i++)
	{
		printf("%-2d|", i); // 打印行号
		
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%-2c ", arr[i][j]);
		}
		printf("\n");
	}
}


// 布置雷
// arr: 存储雷的棋盘数组
// row: 棋盘的行数
// col: 棋盘的列数
void setmine(char arr[ROWs][COLs], int row, int col)
{
	int count = EASY_COUNT;
	
	while (count > 0)
	{
		// 生成随机坐标 (1~row, 1~col)
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		
		// 如果该位置还没有雷，就布置一个雷
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

//�Ų��ף��������귨�Ų�
//����ΧһȺ��ASCII��ֵ�� ��ȥ �˸�'0',��Ϊ'1'��49��'0'��48��
// 统计周围雷的数量
// mine: 存储雷的棋盘数组
// x: 当前位置的行坐标
// y: 当前位置的列坐标
// 返回值: 周围8个位置的雷的数量
static int collectmine(char mine[ROWs][COLs], int x, int y)
{
	// 计算周围8个位置的雷的数量（利用ASCII码值相减）
	return (mine[x - 1][y - 1] - '0') + (mine[x - 1][y] - '0') + (mine[x - 1][y + 1] - '0') +
	       (mine[x][y - 1] - '0') +                           (mine[x][y + 1] - '0') +
	       (mine[x + 1][y - 1] - '0') + (mine[x + 1][y] - '0') + (mine[x + 1][y + 1] - '0');
}

// 排查雷
// mine: 存储雷的棋盘数组
// show: 显示给玩家的棋盘数组
// row: 棋盘的行数
// col: 棋盘的列数
void findmine(char mine[ROWs][COLs], char show[ROWs][COLs], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	int total_cells = row * col;
	int safe_cells = total_cells - EASY_COUNT;
	
	while (win < safe_cells)
	{
		// 输入坐标
		printf("\n请输入要排查的坐标 (x y):> ");
		
		// 输入验证
		while (scanf("%d %d", &x, &y) != 2)
		{
			printf("输入错误，请输入两个数字 (x y):> ");
			// 清空输入缓冲区
			while (getchar() != '\n');
		}
		
		// 检查坐标是否在有效范围内
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			// 检查该位置是否已经被排查过
			if (show[x][y] != '*')
			{
				printf("该位置已经被排查过，请重新输入！\n");
				continue;
			}
			
			// 检查是否踩到雷
			if (mine[x][y] == '1')
			{
				printf("\n很遗憾，你踩到雷了！游戏结束！\n");
				
				// 显示所有雷的位置
				int i, j;
				for (i = 1; i <= row; i++)
				{
					for (j = 1; j <= col; j++)
					{
						if (mine[i][j] == '1')
						{
							show[i][j] = 'X'; // X表示雷的位置
						}
					}
				}
				
				displayboard(show, ROW, COL);
				break;
			}
			else
			{
				// 统计周围雷的数量
				int count = collectmine(mine, x, y);
				show[x][y] = count + '0'; // 转换为对应的数字字符
				
				// 显示更新后的棋盘
				displayboard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法，请输入1-%d之间的数字！\n", row);
		}
	}
	
	// 检查是否获胜
	if (win == safe_cells)
	{
		printf("\n恭喜你，成功排查出所有的雷！游戏胜利！\n");
		
		// 显示所有雷的位置
		int i, j;
		for (i = 1; i <= row; i++)
		{
			for (j = 1; j <= col; j++)
			{
				if (mine[i][j] == '1')
				{
					show[i][j] = 'O'; // O表示成功标记的雷
				}
			}
		}
		
		displayboard(show, ROW, COL);
	}
}